package com.yuntsg.nnsfcp.service.front.ut;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Value;

import javax.servlet.http.HttpServletRequest;
import java.util.Date;

/**
 * 生成 token  解密token
 *
 * @author ：ljx
 * @date ：Created in 2019/12/11  21:27
 */
public class TokenUtils {

    @Value("${jwt.ttl}")
    private Long ttl;

    @Value("${jwt.key}")
    private String key;

    public void setTtl(Long ttl) {
        this.ttl = ttl;
    }

    public void setKey(String key) {
        this.key = key;
    }

    /**
     * 生成token
     *
     * @param userId   用户id
     * @param userName 用户名
     * @param phone    手机号
     * @return
     */
    public String createToken(String userId, String userName, String phone, String account) {
        long currentTime = System.currentTimeMillis();
        return Jwts.builder()
                .setId(userId)
                .setSubject(userName)
                .claim("phone", phone)
                .claim("account", account)
                // 过期时间 配置文件中读取, 30分钟.
                .setExpiration(new Date(currentTime + ttl))
                // 创建时间
                .setIssuedAt(new Date())
                // 加密方式 及 密钥
                .signWith(SignatureAlgorithm.HS256, key)
                .compact();
    }

    /**
     * 解密token
     *
     * @param token token
     * @return 返回存储的数据map
     */
    public Claims parsingToken(String token) {
        try {
            return Jwts.parser()
                    .setSigningKey(key)
                    .parseClaimsJws(token)
                    .getBody();
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 临时解析应急
     *
     * @param request
     * @return
     */
    public String getRequestAttr(HttpServletRequest request) {
        //判断有没有token
        String serverTokenStr = request.getHeader("token");
        if (StringUtils.isEmpty(serverTokenStr) || "null".equals(serverTokenStr)) {
            return null;
        }

        Claims claims = parsingToken(serverTokenStr);
        if (claims == null) {
            return null;
        }
        request.setAttribute("u_id", claims.getId());
        request.setAttribute("u_Name", claims.getSubject());
        request.setAttribute("u_phone", claims.get("phone"));
        request.setAttribute("u_account", claims.get("account"));
        return "";
    }

}
